<script type="text/javascript">
'use strict';
	// 函数内部申明的变量, 只在函数内部有效, 编程语言大概都这样吧
	function foo() {
		var x;
		x = 1;
		return x;
	}

	function bar() {
		var x;
		x = 'a';
		return x;
	}

	// 函数是可以嵌套的
	function foo() {
		var x = 1;
		function bar() {
			var y = x + 1; // bar 可以访问 foo 的变量
		}
		// var z = y + 1; // foo 不可以访问 bar的变量
	}

	// 函数内定义的变量, 在调用时, 会被"提升"申明到函数顶部, 但是不会提升变量的赋值
	function foo() {
		var x = 1;
		console.log(x+y);
		var y = 2;
	}
	foo();

	// 全局作用域, JavaScript默认的一个全局对象window, 全局变量被绑定到了window对象
	var course = 'Learn JavaScript';
	console.log(window.course);

	// window.alert("调用window.alert()");
	var old_alert = window.alert;
	window.alert = function() {};
	// alert('alert 失效了');
	window.alert = old_alert;
	// alert("alert 复活了!");

	// 名字空间, 全局变量会绑定到window对象上, 这样容易造成冲突, 把变量绑定到一个全局变量是个好习惯
	var MYAPP = {};

	MYAPP.name = 'myapp';
	MYAPP.version = 1.1;
	console.log(MYAPP.name);
	console.log(MYAPP.version);

	MYAPP.foo = function() {
		console.log('MYAPP.foo');
	};
	MYAPP.foo();

	// let 申明块级作用域的变量 如 for 循环
	for (var s = 0; s <= 100; s++) {
		//
	}
	console.log(s); // 变量 s 依然存在
	for (let d = 0; d <= 100; d++) {
		//
	}
	// console.log(d); // 报错

	// const 来申明常数
	const PI = 3.14;
	// PI = 3; // 无效或者报错
	console.log(PI);


	// 解构赋值
	var array = ['hello', 'JavaScript', 'ES6'];
	var x = array[0], y = array[1], z = array[2]; // 传统赋值
	console.log(x + y + z);

	var [x, y, z] = ['HELLO', 'javascript', 'es6']; // 结构赋值
	console.log(x + y +z);

	var [x, [y, [z]]] = ['hello', ['javascript', ['ES6']]];
	console.log(x+y+z);

	var person = {
		name: '小明',
		age: 20,
		gender: 'male',
		passport: 'G-12345678',
		school: 'No.4 middle school'
	};

	var {name, age, passport} = person;
	console.log(name,age,passport);

	// 嵌套对象解析
	var person = {
		name: '小明',
		age: 20,
		gender: 'male',
		passport: 'G-12345678',
		school: 'No.4 middle school',
		address: {
			city: 'Beijing',
			street: 'No.1 Road',
			zipcode: '10001'
		}
	};
	var {name, address:{city, zipcode}} = person;
	console.log(name, city, zipcode); //冒号其实是改名的意思
	var {name:a, age:g, address:{city:c, zipcode:z}} = person
	console.log(a,g,c,z);
	var {name, single=true} = person; // 没有single属性

	var x, y;
	// {x, y} = {name:1,x:100,y:200}; // 报错, JavaScript把 开头为{的语句当作语句快处理
	({x, y} = {name:1,x:100,y:200}); // 加个小括号处理
	console.log(x,y);

	var x=10, y=15;
	[x, y] = [y, x]; // 置换x, y
	console.log('x:',x,'y:', y);

	// 快速获取当前域名和路径
	var {hostname:domain, pathname:path} = location;
	console.log('domain:',domain, 'path:', path);

	// 创建一个函数, 接受对象为参数
	function buildDate({year, month, day, hour=0, minute=0, second=0}) {
		return new Date(year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second);
	}
	console.log(buildDate({year:2018, month:4, day: 19}));
	console.log(buildDate({year:2018, month:4, day: 19, hour:0, minute:57, second:10}));
	// 解构赋值 仅支持 Chrome，Firefox，Edge 等浏览器
</script>